Flutter এ Device Features Access করা

Mobile App Development - ফ্লাটার (Flutter)
223

Flutter এ Device Features Access করতে আপনি বিভিন্ন 3rd Party Plugins এবং Flutter এর Platform Channels ব্যবহার করতে পারেন। এই ফিচারগুলো অ্যাপ্লিকেশনে অ্যাক্সেস দেয় ডিভাইসের ক্যামেরা, লোকেশন, সেন্সর, ব্যাটারি, এবং আরও অনেক কিছুর সাথে। Flutter এর সমৃদ্ধ প্লাগইন ইকোসিস্টেমের মাধ্যমে আপনি সহজেই ডিভাইস ফিচারগুলো ইন্টিগ্রেট করতে পারেন, যা অ্যাপ্লিকেশনকে আরও শক্তিশালী এবং ইন্টারেকটিভ করে তোলে।

Flutter এ Device Features Access করার উপায়:

  1. 3rd Party Plugins ব্যবহার করা: Flutter এর জন্য অনেক প্লাগইন উপলব্ধ আছে, যা ডিভাইস ফিচার অ্যাক্সেস করা সহজ করে, যেমন ক্যামেরা, লোকেশন, সেন্সর ইত্যাদি।
  2. Platform Channels ব্যবহার করা: যখন কোন নির্দিষ্ট প্লাগইন উপলব্ধ না থাকে বা কাস্টম ইমপ্লিমেন্টেশনের প্রয়োজন হয়, তখন Platform Channels ব্যবহার করে Flutter থেকে নেটিভ কোড (Android/iOS) কল করা যায়।

জনপ্রিয় Device Features এবং তাদের অ্যাক্সেস করার পদ্ধতি:

১. ক্যামেরা অ্যাক্সেস (camera):

Flutter এ camera প্লাগইন ব্যবহার করে ডিভাইসের ক্যামেরা অ্যাক্সেস করা যায়। এটি ক্যামেরা প্রিভিউ দেখানো, ছবি তোলা, এবং ভিডিও রেকর্ডিংয়ের জন্য ব্যবহৃত হয়।

camera প্লাগইন সেটআপ:

pubspec.yaml ফাইলে প্লাগইন যুক্ত করুন:

dependencies:
  camera: ^0.10.0+4

AndroidAndroidManifest.xml ফাইলে নিচের পারমিশন যোগ করুন:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO"/>

iOSInfo.plist ফাইলে নিচের পারমিশন যোগ করুন:

<key>NSCameraUsageDescription</key>
<string>We need access to the camera to take photos</string>
<key>NSMicrophoneUsageDescription</key>
<string>We need access to the microphone for video recording</string>

ক্যামেরা উদাহরণ:

import 'package:camera/camera.dart';
import 'package:flutter/material.dart';

class CameraExample extends StatefulWidget {
  @override
  _CameraExampleState createState() => _CameraExampleState();
}

class _CameraExampleState extends State<CameraExample> {
  late CameraController _controller;
  late List<CameraDescription> _cameras;
  
  @override
  void initState() {
    super.initState();
    _initializeCamera();
  }

  Future<void> _initializeCamera() async {
    _cameras = await availableCameras();
    _controller = CameraController(_cameras[0], ResolutionPreset.high);
    await _controller.initialize();
    setState(() {});
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    if (!_controller.value.isInitialized) {
      return Center(child: CircularProgressIndicator());
    }
    return CameraPreview(_controller);
  }
}

ব্যাখ্যা:

  • availableCameras(): ডিভাইসের সব ক্যামেরা লিস্ট করে।
  • CameraController: ক্যামেরা কন্ট্রোল এবং প্রিভিউ দেখানোর জন্য ব্যবহার করা হয়।
  • CameraPreview: ক্যামেরা ফিড UI তে প্রদর্শন করে।

২. লোকেশন অ্যাক্সেস (geolocator):

Flutter এ geolocator প্লাগইন ব্যবহার করে ডিভাইসের জিপিএস লোকেশন অ্যাক্সেস করা যায়। এটি বর্তমান লোকেশন, লোকেশন স্ট্রিম, এবং স্থানাঙ্ক পরিবর্তন ট্র্যাক করতে সহায়ক।

geolocator প্লাগইন সেটআপ:

pubspec.yaml ফাইলে প্লাগইন যুক্ত করুন:

dependencies:
  geolocator: ^9.0.2

AndroidAndroidManifest.xml ফাইলে নিচের পারমিশন যোগ করুন:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

iOSInfo.plist ফাইলে নিচের পারমিশন যোগ করুন:

<key>NSLocationWhenInUseUsageDescription</key>
<string>We need access to your location to show your current position</string>

লোকেশন উদাহরণ:

import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';

class LocationExample extends StatefulWidget {
  @override
  _LocationExampleState createState() => _LocationExampleState();
}

class _LocationExampleState extends State<LocationExample> {
  Position? _currentPosition;

  Future<void> _getCurrentLocation() async {
    bool serviceEnabled = await Geolocator.isLocationServiceEnabled();
    if (!serviceEnabled) {
      return Future.error('Location services are disabled.');
    }

    LocationPermission permission = await Geolocator.checkPermission();
    if (permission == LocationPermission.denied) {
      permission = await Geolocator.requestPermission();
      if (permission == LocationPermission.denied) {
        return Future.error('Location permissions are denied');
      }
    }

    Position position = await Geolocator.getCurrentPosition();
    setState(() {
      _currentPosition = position;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Location Example')),
      body: Center(
        child: _currentPosition != null
            ? Text('Location: ${_currentPosition!.latitude}, ${_currentPosition!.longitude}')
            : ElevatedButton(
                onPressed: _getCurrentLocation,
                child: Text('Get Location'),
              ),
      ),
    );
  }
}

ব্যাখ্যা:

  • Geolocator.getCurrentPosition(): বর্তমান লোকেশন রিটার্ন করে।
  • LocationPermission: লোকেশন পারমিশন চেক এবং রিকোয়েস্ট করা হয়।

৩. ব্যাটারি লেভেল চেক করা (battery_plus):

Flutter এ battery_plus প্লাগইন ব্যবহার করে ডিভাইসের ব্যাটারি লেভেল চেক করা যায় এবং ব্যাটারি স্ট্যাটাস (চার্জিং, ডিসচার্জিং ইত্যাদি) ট্র্যাক করা যায়।

battery_plus প্লাগইন সেটআপ:

  1. pubspec.yaml ফাইলে প্লাগইন যুক্ত করুন:
dependencies:
  battery_plus: ^2.1.0

ব্যাটারি উদাহরণ:

import 'package:flutter/material.dart';
import 'package:battery_plus/battery_plus.dart';

class BatteryExample extends StatefulWidget {
  @override
  _BatteryExampleState createState() => _BatteryExampleState();
}

class _BatteryExampleState extends State<BatteryExample> {
  final Battery _battery = Battery();
  int _batteryLevel = 0;

  Future<void> _getBatteryLevel() async {
    final batteryLevel = await _battery.batteryLevel;
    setState(() {
      _batteryLevel = batteryLevel;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Battery Example')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('Battery Level: $_batteryLevel%'),
            ElevatedButton(
              onPressed: _getBatteryLevel,
              child: Text('Get Battery Level'),
            ),
          ],
        ),
      ),
    );
  }
}

ব্যাখ্যা:

  • Battery.batteryLevel: বর্তমান ব্যাটারি লেভেল রিটার্ন করে।
  • Battery(): ব্যাটারি স্ট্যাটাস এবং লেভেল অ্যাক্সেস করার জন্য ইনস্ট্যান্স তৈরি করা হয়।

৪. Platform Channels ব্যবহার করা:

Flutter এ Platform Channels ব্যবহার করে আপনি Flutter থেকে নেটিভ কোড (Java/Kotlin, Swift/Objective-C) কল করতে পারেন। যখন কোনো নির্দিষ্ট ফিচার বা প্লাগইন উপলব্ধ না থাকে, তখন এটি ব্যবহার করা হয়।

Platform Channel উদাহরণ (Battery Level):

Flutter কোড (Dart):

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

class PlatformChannelExample extends StatefulWidget {
  @override
  _PlatformChannelExampleState createState() => _PlatformChannelExampleState();
}

class _PlatformChannelExampleState extends State<PlatformChannelExample> {
  static const platform = MethodChannel('battery');
  String _batteryLevel = 'Unknown';

  Future<void> _getBatteryLevel() async {
    try {
      final int result = await platform.invokeMethod('getBatteryLevel');
      setState(() {
        _batteryLevel = 'Battery level: $result%';
      });
    } on PlatformException catch (e) {
      setState(() {
        _batteryLevel = 'Failed to get battery level: ${e.message}';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Platform Channel Example')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(_batteryLevel),
            ElevatedButton(
              onPressed: _getBatteryLevel,
              child: Text('Get Battery Level'),
            ),
          ],
        ),
      ),
    );
  }
}

Android (MainActivity.java):

package com.example.yourapp;

import android.os.Bundle;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugins.GeneratedPluginRegistrant;
import android.os.BatteryManager;
import android.content.Context;
import io.flutter.plugin.common.MethodChannel;

public class MainActivity extends FlutterActivity {
    private static final String CHANNEL = "battery";

    @Override
    public void configureFlutterEngine(FlutterEngine flutterEngine) {
        super.configureFlutterEngine(flutterEngine);
        new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
            .setMethodCallHandler(
                (call, result) -> {
                    if (call.method.equals("getBatteryLevel")) {
                        int batteryLevel = getBatteryLevel();

                        if (batteryLevel != -1) {
                            result.success(batteryLevel);
                        } else {
                            result.error("UNAVAILABLE", "Battery level not available.", null);
                        }
                    } else {
                        result.notImplemented();
                    }
                }
            );
    }

    private int getBatteryLevel() {
        BatteryManager batteryManager = (BatteryManager) getSystemService(Context.BATTERY_SERVICE);
        return batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);
    }
}

উপসংহার:

Flutter এ Device Features Access করার মাধ্যমে অ্যাপ্লিকেশনকে আরো ইন্টারেকটিভ এবং ফিচার-সমৃদ্ধ করা যায়। জনপ্রিয় প্লাগইন এবং Platform Channels ব্যবহার করে আপনি সহজেই ক্যামেরা, লোকেশন, ব্যাটারি, এবং আরও অনেক কিছু অ্যাক্সেস করতে পারেন, যা অ্যাপ্লিকেশনের কার্যক্ষমতা ও ব্যবহারকারীর অভিজ্ঞতা উন্নত করে।

Content added By
189

Flutter এ Camera এবং Gallery থেকে ইমেজ পিক করার জন্য image_picker প্যাকেজ একটি জনপ্রিয় সমাধান। এটি সহজেই Flutter অ্যাপে ক্যামেরা এবং গ্যালারি থেকে ইমেজ পিক করার ফিচার ইন্টিগ্রেট করতে সাহায্য করে। নিচে image_picker প্যাকেজ ব্যবহার করে কিভাবে Camera এবং Gallery থেকে ইমেজ পিক করা যায়, তার ধাপে ধাপে গাইড দেওয়া হলো।

ধাপ ১: image_picker প্যাকেজ ইনস্টল করা

আপনার প্রোজেক্টের pubspec.yaml ফাইলে image_picker ডিপেন্ডেন্সি যোগ করুন:

নোট: সর্বশেষ ভার্সন পেতে pub.dev এ চেক করুন।

dependencies:
  flutter:
    sdk: flutter
  image_picker: ^1.0.0

এরপর, টার্মিনালে নিচের কমান্ডটি রান করে ডিপেন্ডেন্সি ইনস্টল করুন:

flutter pub get

ধাপ ২: iOS এবং Android কনফিগারেশন

Android কনফিগারেশন

AndroidManifest.xml ফাইলে প্রয়োজনীয় পারমিশন যোগ করুন:

<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

android/app/src/main/AndroidManifest.xml ফাইলের মধ্যে নিচের লাইনটি যোগ করুন, যদি এটি না থাকে:

<application
    android:requestLegacyExternalStorage="true"
    ... >
</application>

iOS কনফিগারেশন

  1. ios/Runner/Info.plist ফাইলে ক্যামেরা এবং ফটো লাইব্রেরি অ্যাক্সেসের জন্য নিচের প্যারামিটারগুলো যোগ করুন:
<key>NSCameraUsageDescription</key>
<string>We need to access your camera to take photos.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>We need to access your photo library to choose photos.</string>

ধাপ ৩: Dart কোড লিখে ইমেজ পিক করা

  1. image_picker ইমপোর্ট করুন এবং একটি StatefulWidget তৈরি করুন যেখানে ইমেজ পিক করার লজিক লেখা হবে:
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'dart:io';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Image Picker Example',
      home: ImagePickerScreen(),
    );
  }
}

class ImagePickerScreen extends StatefulWidget {
  @override
  _ImagePickerScreenState createState() => _ImagePickerScreenState();
}

class _ImagePickerScreenState extends State<ImagePickerScreen> {
  File? _image;
  final ImagePicker _picker = ImagePicker();

  // ক্যামেরা থেকে ইমেজ পিক করা
  Future<void> _pickImageFromCamera() async {
    final pickedFile = await _picker.pickImage(source: ImageSource.camera);
    if (pickedFile != null) {
      setState(() {
        _image = File(pickedFile.path);
      });
    }
  }

  // গ্যালারি থেকে ইমেজ পিক করা
  Future<void> _pickImageFromGallery() async {
    final pickedFile = await _picker.pickImage(source: ImageSource.gallery);
    if (pickedFile != null) {
      setState(() {
        _image = File(pickedFile.path);
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Picker Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            _image != null
                ? Image.file(
                    _image!,
                    width: 300,
                    height: 300,
                  )
                : Text('No image selected'),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _pickImageFromCamera,
              child: Text('Pick Image from Camera'),
            ),
            ElevatedButton(
              onPressed: _pickImageFromGallery,
              child: Text('Pick Image from Gallery'),
            ),
          ],
        ),
      ),
    );
  }
}

কোডের ব্যাখ্যা:

ImagePicker:

  • _picker হলো ImagePicker এর একটি ইনস্ট্যান্স, যা ক্যামেরা বা গ্যালারি থেকে ইমেজ পিক করতে সাহায্য করে।

_pickImageFromCamera:

  • ক্যামেরা থেকে ইমেজ পিক করতে pickImage(source: ImageSource.camera) মেথড ব্যবহার করা হয়েছে।
  • ইউজার ক্যামেরা দিয়ে ইমেজ নিলে, সেই ইমেজের পাথ _image ভ্যারিয়েবলে সংরক্ষণ করা হয়েছে এবং UI আপডেট করা হয়েছে।

_pickImageFromGallery:

  • গ্যালারি থেকে ইমেজ পিক করতে pickImage(source: ImageSource.gallery) মেথড ব্যবহার করা হয়েছে।
  • ইউজার গ্যালারি থেকে ইমেজ সিলেক্ট করলে, সেই ইমেজের পাথ _image ভ্যারিয়েবলে সংরক্ষণ করা হয়েছে এবং UI আপডেট করা হয়েছে।

Image.file:

  • _image ভ্যারিয়েবলে যদি কোনো ইমেজ থাকে, তাহলে সেটি UI তে প্রদর্শন করা হয়। না থাকলে একটি টেক্সট মেসেজ দেখানো হয়।

ধাপ ৪: APK বা iOS বিল্ড করা এবং পরীক্ষা করা

  • নিশ্চিত করুন যে আপনার প্রজেক্টে কোনো ত্রুটি নেই এবং flutter run কমান্ড ব্যবহার করে আপনার অ্যাপটি চালান।
  • আপনার অ্যাপ ইনস্টল করার পর, ক্যামেরা এবং গ্যালারি থেকে ইমেজ পিক করার জন্য প্রয়োজনীয় পারমিশন চাইবে। পারমিশন দিলে ক্যামেরা চালু হবে বা গ্যালারি থেকে ইমেজ সিলেক্ট করতে পারবেন।

সতর্কতা এবং পরামর্শ:

পারমিশন চেক করা:

  • Flutter এ পারমিশন সংক্রান্ত কাজ করতে permission_handler প্যাকেজ ব্যবহার করতে পারেন। এটি আপনাকে অ্যাপ্লিকেশন চলার সময় পারমিশন চেক করতে এবং প্রয়োজনীয় পারমিশন গ্রান্ট করতে সাহায্য করবে।

Device Compatibility:

  • নিশ্চিত করুন যে আপনার অ্যাপ সব ডিভাইসে সমানভাবে কাজ করছে। কিছু ডিভাইসে ক্যামেরা বা গ্যালারি ফিচার ঠিকমত কাজ না করতে পারে, সেক্ষেত্রে কোডের মাধ্যমে এগুলো চেক করুন।

ইমেজ কম্প্রেস করা:

  • ইমেজ সাইজ কমাতে flutter_image_compress এর মত প্যাকেজ ব্যবহার করতে পারেন। এটি ক্যামেরা বা গ্যালারি থেকে নেওয়া ইমেজ কমপ্রেস করে অ্যাপের পারফরম্যান্স উন্নত করতে সাহায্য করবে।

Flutter এ Camera এবং Gallery থেকে ইমেজ পিক করার সুবিধা:

  • সহজ এবং দ্রুত ইমেজ পিক করার ফিচার ইমপ্লিমেন্ট করা যায়।
  • Flutter এর সমৃদ্ধ প্লাগইন ইকোসিস্টেম এ ধরনের কাজ আরও সহজ করে।
  • ক্যামেরা এবং গ্যালারি উভয় ফিচার ব্যবহার করা গেলে, ইউজারের সুবিধামত ছবি তোলার বা সিলেক্ট করার সুযোগ দেয়া যায়।

Flutter এ Camera এবং Gallery থেকে ইমেজ পিক করতে image_picker প্যাকেজ অত্যন্ত কার্যকরী এবং সহজ। এই কৌশলগুলো ব্যবহার করে আপনি আপনার অ্যাপে ইমেজ পিক করার ফিচার সহজেই ইন্টিগ্রেট করতে পারবেন।

Content added By

Geolocation এবং Google Maps Integration

276

Flutter এ Geolocation এবং Google Maps Integration একটি গুরুত্বপূর্ণ কৌশল, যা আপনাকে ব্যবহারকারীর অবস্থান ট্র্যাক করতে এবং ম্যাপে প্রদর্শন করতে সহায়তা করে। এটি লোকেশন-বেসড সার্ভিস বা নেভিগেশন অ্যাপ তৈরি করার ক্ষেত্রে অত্যন্ত কার্যকরী। Flutter এ geolocator এবং google_maps_flutter প্লাগইন ব্যবহার করে আপনি সহজেই এই ইন্টিগ্রেশন সম্পন্ন করতে পারেন।

Geolocation এবং Google Maps Integration এর ধাপসমূহ:

ধাপ ১: প্লাগইন ইন্সটল করা:

Flutter এ Geolocation এবং Google Maps ব্যবহার করার জন্য দুটি প্রধান প্লাগইন প্রয়োজন:

  1. Geolocator: ডিভাইসের বর্তমান লোকেশন পেতে এবং ট্র্যাক করতে ব্যবহৃত হয়।
  2. Google Maps Flutter: Google Maps এর Flutter এ ইন্টিগ্রেশন করার জন্য ব্যবহৃত হয়।

pubspec.yaml এ এই প্লাগইনগুলো যুক্ত করুন:

dependencies:
  geolocator: ^10.0.0
  google_maps_flutter: ^2.2.0

তারপর, টার্মিনালে গিয়ে কমান্ড রান করুন:

flutter pub get

ধাপ ২: Android এবং iOS পারমিশন কনফিগার করা:

কিছু পারমিশন যোগ করা প্রয়োজন যাতে অ্যাপ্লিকেশন লোকেশন অ্যাক্সেস করতে পারে।

Android:

android/app/src/main/AndroidManifest.xml ফাইলে নিচের পারমিশনগুলো যোগ করুন:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.app">
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <application
        android:requestLegacyExternalStorage="true"
        android:usesCleartextTraffic="true"
        android:networkSecurityConfig="@xml/network_security_config">
    </application>
</manifest>

iOS:

ios/Runner/Info.plist ফাইলে নিচের কোড যোগ করুন:

<key>NSLocationWhenInUseUsageDescription</key>
<string>We need your location to show your position on the map.</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>We need your location to show your position on the map.</string>

ধাপ ৩: Google Maps API Key সেটআপ করা:

Google Maps API ব্যবহারের জন্য একটি API key প্রয়োজন। এটি পেতে আপনাকে Google Cloud Console এ যেতে হবে এবং একটি প্রোজেক্ট তৈরি করে Google Maps API সক্রিয় করতে হবে।

API Key পাওয়ার পর, এটি Android এবং iOS এ যুক্ত করতে হবে।

Android:

android/app/src/main/AndroidManifest.xmlapplication ট্যাগের ভেতরে নিচের মত করে API key যোগ করুন:

<meta-data
    android:name="com.google.android.geo.API_KEY"
    android:value="YOUR_API_KEY_HERE"/>

iOS:

ios/Runner/AppDelegate.swift বা ios/Runner/AppDelegate.m ফাইলে নিচের মত কোড যোগ করুন:

GMSServices.provideAPIKey("YOUR_API_KEY_HERE")

ধাপ ৪: Geolocation ব্যবহার করা:

geolocator প্লাগইন দিয়ে আপনি ডিভাইসের বর্তমান লোকেশন পেতে পারেন।

import 'package:geolocator/geolocator.dart';

// লোকেশন চেক করা এবং পারমিশন চাওয়া
Future<Position> _getCurrentLocation() async {
  bool serviceEnabled;
  LocationPermission permission;

  // লোকেশন সার্ভিস সক্রিয় কিনা তা চেক করা
  serviceEnabled = await Geolocator.isLocationServiceEnabled();
  if (!serviceEnabled) {
    return Future.error('Location services are disabled.');
  }

  // লোকেশন পারমিশন চেক করা
  permission = await Geolocator.checkPermission();
  if (permission == LocationPermission.denied) {
    permission = await Geolocator.requestPermission();
    if (permission == LocationPermission.denied) {
      return Future.error('Location permissions are denied');
    }
  }

  if (permission == LocationPermission.deniedForever) {
    return Future.error('Location permissions are permanently denied');
  }

  // ডিভাইসের বর্তমান লোকেশন পাওয়া
  return await Geolocator.getCurrentPosition();
}

ধাপ ৫: Google Maps উইজেট তৈরি করা:

Google Maps ইন্টিগ্রেট করতে, আপনি google_maps_flutter প্লাগইন ব্যবহার করে GoogleMap উইজেট তৈরি করতে পারেন।

import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:geolocator/geolocator.dart';

class MapScreen extends StatefulWidget {
  @override
  _MapScreenState createState() => _MapScreenState();
}

class _MapScreenState extends State<MapScreen> {
  late GoogleMapController mapController;
  LatLng _initialPosition = LatLng(0.0, 0.0);

  @override
  void initState() {
    super.initState();
    _setInitialLocation();
  }

  // প্রাথমিক লোকেশন সেট করা
  Future<void> _setInitialLocation() async {
    Position position = await _getCurrentLocation();
    setState(() {
      _initialPosition = LatLng(position.latitude, position.longitude);
    });
  }

  // লোকেশন চেক করা এবং পারমিশন চাওয়া
  Future<Position> _getCurrentLocation() async {
    bool serviceEnabled;
    LocationPermission permission;

    serviceEnabled = await Geolocator.isLocationServiceEnabled();
    if (!serviceEnabled) {
      return Future.error('Location services are disabled.');
    }

    permission = await Geolocator.checkPermission();
    if (permission == LocationPermission.denied) {
      permission = await Geolocator.requestPermission();
      if (permission == LocationPermission.denied) {
        return Future.error('Location permissions are denied');
      }
    }

    if (permission == LocationPermission.deniedForever) {
      return Future.error('Location permissions are permanently denied');
    }

    return await Geolocator.getCurrentPosition();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Google Maps Example')),
      body: _initialPosition.latitude == 0.0 && _initialPosition.longitude == 0.0
          ? Center(child: CircularProgressIndicator())
          : GoogleMap(
              initialCameraPosition: CameraPosition(
                target: _initialPosition,
                zoom: 14.0,
              ),
              onMapCreated: (GoogleMapController controller) {
                mapController = controller;
              },
            ),
    );
  }
}

ধাপ ৬: Google Maps উইজেটে Custom Markers এবং Interactions যোগ করা:

Google Maps এ মাকর্স এবং কাস্টম ইন্টারঅ্যাকশন যোগ করা যায়। নিচে একটি উদাহরণ দেয়া হলো:

Set<Marker> _createMarkers() {
  return {
    Marker(
      markerId: MarkerId('currentLocation'),
      position: _initialPosition,
      infoWindow: InfoWindow(title: 'You are here'),
    ),
  };
}

// GoogleMap উইজেটে মাকর্স যোগ করা
GoogleMap(
  initialCameraPosition: CameraPosition(
    target: _initialPosition,
    zoom: 14.0,
  ),
  markers: _createMarkers(),
  onMapCreated: (GoogleMapController controller) {
    mapController = controller;
  },
)

Geolocation এবং Google Maps Integration এর Best Practices:

  1. Location Permission Management: লোকেশন পারমিশন সঠিকভাবে চেক এবং ম্যানেজ করুন। যদি ইউজার পারমিশন না দেয়, তাহলে একটি কাস্টম মেসেজ দেখান।
  2. API Keys সুরক্ষিত রাখুন: Google Maps API key সিক্রেট রাখা গুরুত্বপূর্ণ। API key লিক হলে কেউ আপনার API ব্যবহার করে খরচ বাড়াতে পারে।
  3. Optimize Location Updates: লোকেশন আপডেট করতে Geolocator এর স্ট্রিম ব্যবহার করে আপনি ইউজারের অবস্থান ট্র্যাক করতে পারেন। তবে এটি মেমোরি এবং ব্যাটারি ব্যবহারে সাশ্রয়ী হতে হবে।
  4. Custom Markers এবং Themes: মানচিত্রের মাকর্স এবং থিম কাস্টমাইজ করুন যাতে এটি আপনার অ্যাপের ডিজাইনের সাথে মানানসই হয়।

উপসংহার:

Flutter এ Geolocation এবং Google Maps Integration ব্যবহার করে আপনি একটি শক্তিশালী লোকেশন-ভিত্তিক অ্যাপ তৈরি করতে পারেন। সঠিকভাবে পারমিশন কনফিগার, API key ব্যবস্থাপনা, এবং মাকর্স/ইন্টারঅ্যাকশন কাস্টমাইজ করে আপনার অ্যাপের কার্যকারিতা উন্নত করতে পারেন।

Content added By

Push Notifications এবং Background Services

236

Flutter এ Push Notifications এবং Background Services ইন্টিগ্রেট করা আপনার অ্যাপ্লিকেশনকে আরো ইন্টারেকটিভ এবং ফাংশনাল করে তোলে। Push Notifications ব্যবহার করে আপনি ব্যবহারকারীদের কাছে গুরুত্বপূর্ণ আপডেট পাঠাতে পারেন, আর Background Services ব্যবহার করে অ্যাপ্লিকেশনটি ব্যাকগ্রাউন্ডে কিছু কাজ পরিচালনা করতে পারে, যেমন ডেটা সিঙ্ক করা বা লোকেশন ট্র্যাকিং।

Flutter এ Push Notifications এবং Background Services সেটআপ করা:

১. Push Notifications (Firebase Cloud Messaging - FCM):

Flutter এ Firebase Cloud Messaging (FCM) হলো Push Notifications ইমপ্লিমেন্ট করার একটি জনপ্রিয় পদ্ধতি। FCM ব্যবহার করে আপনি রিয়েল-টাইমে ব্যবহারকারীদের কাছে নোটিফিকেশন পাঠাতে পারেন।

FCM Setup এবং Integration:

ধাপ ১: Firebase Project তৈরি করা:

  1. Firebase Console এ যান এবং একটি নতুন প্রোজেক্ট তৈরি করুন।
  2. আপনার অ্যাপটি (iOS এবং Android) Firebase Project এর সাথে যুক্ত করুন।
  3. google-services.json (Android) এবং GoogleService-Info.plist (iOS) ফাইলগুলো আপনার Flutter প্রোজেক্টে যুক্ত করুন।

ধাপ ২: Flutter এ firebase_messaging প্লাগইন সেটআপ করা:

pubspec.yaml ফাইলে firebase_messaging প্লাগইন যুক্ত করুন:

dependencies:
  firebase_core: ^2.4.1
  firebase_messaging: ^14.6.5

Androidandroid/app/build.gradle ফাইলে নিচেরটি যোগ করুন:

implementation 'com.google.firebase:firebase-messaging'

AndroidAndroidManifest.xml ফাইলে FirebaseMessagingService এবং permission যোগ করুন:

<service android:name="com.google.firebase.messaging.FirebaseMessagingService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>

ধাপ ৩: Flutter কোডে FCM সেটআপ করা:

import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart';

Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  // Background notification handler
  print("Handling a background message: ${message.messageId}");
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Push Notification Example')),
        body: NotificationPage(),
      ),
    );
  }
}

class NotificationPage extends StatefulWidget {
  @override
  _NotificationPageState createState() => _NotificationPageState();
}

class _NotificationPageState extends State<NotificationPage> {
  @override
  void initState() {
    super.initState();
    FirebaseMessaging.instance.getInitialMessage().then((message) {
      if (message != null) {
        print("New notification: ${message.notification?.title}");
      }
    });

    FirebaseMessaging.onMessage.listen((RemoteMessage message) {
      print("Message received: ${message.notification?.title}");
    });

    FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
      print("Notification opened: ${message.notification?.title}");
    });
  }

  @override
  Widget build(BuildContext context) {
    return Center(child: Text('Listen for notifications here!'));
  }
}

ব্যাখ্যা:

  • FirebaseMessaging.onBackgroundMessage: ব্যাকগ্রাউন্ডে মেসেজ প্রাপ্ত হলে এই হ্যান্ডলার কাজ করে।
  • FirebaseMessaging.onMessage: যখন অ্যাপটি ফোরগ্রাউন্ডে থাকে, তখন নোটিফিকেশন পাওয়া গেলে এটি ট্রিগার হয়।
  • FirebaseMessaging.onMessageOpenedApp: যখন নোটিফিকেশন থেকে অ্যাপটি খোলা হয়, তখন এটি কল হয়।

FCM কনফিগারেশন টিপস:

  • iOSInfo.plist ফাইলে Push Notifications এবং Background Modes সক্ষম করুন।
  • Androidnotification channel এবং অন্যান্য সেটিংস কনফিগার করুন, যাতে নোটিফিকেশন সঠিকভাবে প্রদর্শিত হয়।

২. Background Services (WorkManager):

Flutter এ WorkManager প্লাগইন ব্যবহার করে ব্যাকগ্রাউন্ডে কাজ পরিচালনা করা যায়, যেমন ডেটা সিঙ্ক করা, ব্যাকগ্রাউন্ড প্রসেসিং, বা নির্দিষ্ট ইন্টারভালে কাজ চালানো। এটি মূলত Android এর জন্য ব্যবহৃত হয়, এবং iOS এর জন্য background_fetch অথবা background_mode ব্যবহৃত হয়।

WorkManager সেটআপ করা:

ধাপ ১: WorkManager প্লাগইন ইন্সটল করা:

pubspec.yaml ফাইলে workmanager প্লাগইন যুক্ত করুন:

dependencies:
  workmanager: ^0.5.0

ধাপ ২: Android কনফিগারেশন করা:

android/app/src/main/AndroidManifest.xml ফাইলে পারমিশন এবং সার্ভিস যোগ করুন:

<uses-permission android:name="android.permission.WAKE_LOCK"/>
<service android:name="be.tramckrijte.workmanager.WorkManagerService" android:permission="android.permission.BIND_JOB_SERVICE" android:exported="true"/>

ধাপ ৩: WorkManager ব্যবহার করে ব্যাকগ্রাউন্ড টাস্ক সেট করা:

import 'package:flutter/material.dart';
import 'package:workmanager/workmanager.dart';

void callbackDispatcher() {
  Workmanager().executeTask((task, inputData) {
    print("Background task executed: $task");
    return Future.value(true);
  });
}

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  Workmanager().initialize(callbackDispatcher, isInDebugMode: true);
  Workmanager().registerPeriodicTask("1", "simplePeriodicTask",
      frequency: Duration(hours: 1));

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Background Services Example')),
        body: Center(child: Text('WorkManager Example')),
      ),
    );
  }
}

ব্যাখ্যা:

  • callbackDispatcher: এটি একটি কলব্যাক মেথড, যা ব্যাকগ্রাউন্ডে নির্দিষ্ট কাজ সম্পাদন করে।
  • registerPeriodicTask: নির্দিষ্ট ইন্টারভালে কাজ রেজিস্টার করে, যা ব্যাকগ্রাউন্ডে চলে।
  • initialize: এটি WorkManager ইনিশিয়ালাইজ করে এবং ব্যাকগ্রাউন্ড টাস্ক পরিচালনা করে।

iOS Background Services (background_fetch):

iOS এ ব্যাকগ্রাউন্ড টাস্কের জন্য background_fetch প্লাগইন ব্যবহার করা হয়। এটি আপনাকে নির্দিষ্ট ইন্টারভালে বা ইভেন্টে কাজ সম্পাদন করতে সহায়তা করে।

background_fetch প্লাগইন সেটআপ:

pubspec.yaml ফাইলে প্লাগইন যুক্ত করুন:

dependencies:
  background_fetch: ^1.0.0

iOSInfo.plist ফাইলে Background Modes এবং fetch মুডস কনফিগার করুন।

background_fetch উদাহরণ:

import 'package:flutter/material.dart';
import 'package:background_fetch/background_fetch.dart';

void backgroundFetchHeadlessTask(String taskId) async {
  print("[BackgroundFetch] Headless event received: $taskId");
  BackgroundFetch.finish(taskId);
}

void main() {
  runApp(MyApp());
  BackgroundFetch.registerHeadlessTask(backgroundFetchHeadlessTask);
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('iOS Background Fetch Example')),
        body: Center(child: Text('Background Fetch Example')),
      ),
    );
  }
}

ব্যাখ্যা:

  • BackgroundFetch.registerHeadlessTask: এটি একটি হেডলেস টাস্ক রেজিস্টার করে, যা ব্যাকগ্রাউন্ডে রান হয়।
  • backgroundFetchHeadlessTask: নির্দিষ্ট কাজ পরিচালনা করে, যা ব্যাকগ্রাউন্ড ফেচ ইভেন্ট ট্রিগার হলে কাজ করে।

Flutter এ Push Notifications এবং Background Services এর সেরা চর্চা:

  1. Proper Permission Handling: সবসময় AndroidManifest.xml এবং Info.plist ফাইলগুলোতে প্রয়োজনীয় পারমিশন যুক্ত করুন এবং ব্যবহারকারীদের সঠিকভাবে পারমিশন রিকোয়েস্ট করুন।
  2. Battery Optimization ওভাররাইড: ব্যাটারি অপ্টিমাইজেশন অপশন চেক করুন, কারণ অনেক ডিভাইস ব্যাটারি অপ্টিমাইজেশন এর মাধ্যমে ব্যাকগ্রাউন্ড কাজ বন্ধ করতে পারে।
  3. Notification Channels ব্যবহার করুন: Android এ নোটিফিকেশন চ্যানেল ব্যবহার করে নোটিফিকেশন কাস্টমাইজ করুন, যাতে ব্যবহারকারীরা তাদের পছন্দ অনুযায়ী সেটিংস পরিবর্তন করতে পারে।
  4. Debugging এবং Logging: ব্যাকগ্রাউন্ড টাস্ক এবং নোটিফিকেশন সেটআপের জন্য Flutter DevTools এবং Logcat ব্যবহার করে ডিবাগিং করুন।

উপসংহার:

Flutter এ Push Notifications এবং Background Services ইন্টিগ্রেট করার মাধ্যমে আপনি অ্যাপ্লিকেশনকে আরো ইন্টারেকটিভ এবং কার্যকরী করতে পারবেন। সঠিক প্লাগইন এবং Flutter এর Platform Channels ব্যবহার করে আপনার অ্যাপ্লিকেশনকে শক্তিশালী, রেসপন্সিভ, এবং ফিচার-সমৃদ্ধ করা সহজ।

Content added By

Device Sensors এবং Accelerometer Access

244

Flutter এ Device Sensors এবং Accelerometer অ্যাক্সেস করার জন্য sensor_plus প্যাকেজ বা flutter_sensors এর মত প্যাকেজ ব্যবহার করা যেতে পারে। এই প্যাকেজগুলো ব্যবহার করে আপনি ডিভাইসের সেন্সর ডেটা (যেমন অ্যাক্সিলরোমিটার, জাইরোস্কোপ) অ্যাক্সেস করতে পারেন এবং সেই ডেটা ব্যবহার করে আপনার অ্যাপে বিভিন্ন ফিচার ইমপ্লিমেন্ট করতে পারেন। নিচে Flutter এ ডিভাইস সেন্সর এবং অ্যাক্সিলরোমিটার অ্যাক্সেস করার ধাপে ধাপে গাইড দেওয়া হলো।

ধাপ ১: sensor_plus প্যাকেজ ইনস্টল করা

আপনার প্রজেক্টের pubspec.yaml ফাইলে sensor_plus ডিপেন্ডেন্সি যোগ করুন:

নোট: সর্বশেষ ভার্সন পেতে pub.dev এ চেক করুন।

dependencies:
  flutter:
    sdk: flutter
  sensors_plus: ^2.0.0

এরপর, টার্মিনালে নিচের কমান্ডটি রান করে ডিপেন্ডেন্সি ইনস্টল করুন:

flutter pub get

ধাপ ২: iOS এবং Android কনফিগারেশন

Android কনফিগারেশন

  • সাধারণত Android এ সেন্সরের জন্য আলাদা কোনো পারমিশন প্রয়োজন হয় না। তবে, আপনি যদি সেন্সর ডেটার উপর ভিত্তি করে অ্যাকশান (যেমন ভলিউম পরিবর্তন) করেন, তাহলে প্রয়োজনীয় পারমিশন যোগ করতে হবে।

iOS কনফিগারেশন

  1. ios/Runner/Info.plist ফাইলে নিচের প্যারামিটারটি যোগ করুন:
    • এটি নিশ্চিত করে যে অ্যাপটি অ্যাক্সিলরোমিটার সেন্সর অ্যাক্সেস করবে।
<key>UIRequiredDeviceCapabilities</key>
<array>
  <string>accelerometer</string>
</array>

ধাপ ৩: Dart কোড লিখে অ্যাক্সিলরোমিটার ডেটা অ্যাক্সেস করা

Flutter এ সেন্সর ডেটা অ্যাক্সেস করার জন্য, একটি StatefulWidget তৈরি করে সেন্সরের ডেটা স্ট্রিমের সাথে সাবস্ক্রাইব করা হয় এবং ডেটা UI তে রেন্ডার করা হয়।

import 'package:flutter/material.dart';
import 'package:sensors_plus/sensors_plus.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Accelerometer Example',
      home: AccelerometerScreen(),
    );
  }
}

class AccelerometerScreen extends StatefulWidget {
  @override
  _AccelerometerScreenState createState() => _AccelerometerScreenState();
}

class _AccelerometerScreenState extends State<AccelerometerScreen> {
  // ডিফল্টভাবে ০ সেট করা হলো
  double x = 0.0, y = 0.0, z = 0.0;

  @override
  void initState() {
    super.initState();
    // Accelerometer স্ট্রিমে সাবস্ক্রাইব করা
    accelerometerEvents.listen((AccelerometerEvent event) {
      setState(() {
        x = event.x;
        y = event.y;
        z = event.z;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Accelerometer Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Accelerometer Values:',
              style: TextStyle(fontSize: 18),
            ),
            SizedBox(height: 20),
            Text(
              'X: $x\nY: $y\nZ: $z',
              style: TextStyle(fontSize: 24),
            ),
          ],
        ),
      ),
    );
  }
}

কোডের ব্যাখ্যা:

accelerometerEvents:

  • accelerometerEvents হলো একটি স্ট্রিম যা অ্যাক্সিলরোমিটারের ডেটা পাঠায়। এই স্ট্রিমে সাবস্ক্রাইব করা হয়েছে এবং প্রতিটি আপডেটের সাথে UI তে x, y, এবং z ভ্যালুগুলো আপডেট করা হয়েছে।

setState:

  • setState মেথড ব্যবহার করে প্রতিটি আপডেটের সাথে UI রিফ্রেশ করা হয়েছে, যাতে সর্বশেষ ডেটা প্রদর্শিত হয়।

X, Y, Z ভ্যালু:

  • অ্যাক্সিলরোমিটার সেন্সর x, y, এবং z এক্সিসে ডেটা প্রদান করে। এই ডেটা ব্যবহার করে আপনি ডিভাইসের গতিবিধি এবং অবস্থান নির্ধারণ করতে পারেন।

অন্য সেন্সর অ্যাক্সেস করা

sensor_plus প্যাকেজ ব্যবহার করে অন্যান্য সেন্সর যেমন Gyroscope, Magnetometer অ্যাক্সেস করা সম্ভব। নিচে Gyroscope এর উদাহরণ দেওয়া হলো:

import 'package:sensors_plus/sensors_plus.dart';

class GyroscopeScreen extends StatefulWidget {
  @override
  _GyroscopeScreenState createState() => _GyroscopeScreenState();
}

class _GyroscopeScreenState extends State<GyroscopeScreen> {
  double x = 0.0, y = 0.0, z = 0.0;

  @override
  void initState() {
    super.initState();
    gyroscopeEvents.listen((GyroscopeEvent event) {
      setState(() {
        x = event.x;
        y = event.y;
        z = event.z;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Gyroscope Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Gyroscope Values:',
              style: TextStyle(fontSize: 18),
            ),
            SizedBox(height: 20),
            Text(
              'X: $x\nY: $y\nZ: $z',
              style: TextStyle(fontSize: 24),
            ),
          ],
        ),
      ),
    );
  }
}

Flutter এ Device Sensors এর সুবিধা এবং ব্যবহার

১. Game Development:

  • Accelerometer এবং Gyroscope ব্যবহার করে আপনি ডিভাইসের মুভমেন্ট ট্র্যাক করতে পারেন, যা গেম ডেভেলপমেন্টে ডিভাইসের মোশন ইন্টারঅ্যাকশন তৈরি করতে সহায়তা করে।

২. Fitness Apps:

  • অ্যাক্সিলরোমিটার এবং পেডোমিটার সেন্সর ব্যবহার করে ব্যবহারকারীর পদক্ষেপ, রানিং ট্র্যাক, এবং মোশন অ্যানালাইসিস করা যায়।

৩. Augmented Reality (AR):

  • Gyroscope এবং অন্যান্য সেন্সর ব্যবহার করে অ্যাপ্লিকেশন Augmented Reality (AR) তৈরি করতে পারে, যা ডিভাইসের অবস্থান ট্র্যাক করে এবং UI এ ভিজ্যুয়াল উপাদান প্রক্ষেপণ করে।

Flutter এ Device Sensors এবং Accelerometer ব্যবহারের সুবিধা

  1. ইন্টারঅ্যাক্টিভ অ্যাপ তৈরি করা সহজ: সেন্সরগুলো অ্যাপকে আরও ইন্টারঅ্যাক্টিভ এবং রেসপন্সিভ করতে সহায়তা করে।
  2. গেম এবং ফিটনেস অ্যাপ: ডিভাইসের মুভমেন্ট ডেটা ব্যবহার করে গেম এবং ফিটনেস অ্যাপ উন্নত করা যায়।
  3. AR এবং VR ইন্টিগ্রেশন: সেন্সর ডেটা ব্যবহার করে অ্যাপ্লিকেশনে Augmented Reality (AR) এবং Virtual Reality (VR) ইন্টিগ্রেট করা সম্ভব।

সতর্কতা এবং পরামর্শ

Device Compatibility:

  • কিছু ডিভাইসে সেন্সর সঠিকভাবে কাজ নাও করতে পারে। তাই কোডে নিশ্চিত করুন যে সেন্সরগুলো সাপোর্ট করে কিনা এবং ব্যাকআপ অপশন রাখুন।

Battery Consumption:

  • সেন্সরগুলো ফ্রিকোয়েন্টলি ব্যবহার করলে ডিভাইসের ব্যাটারি দ্রুত খরচ হতে পারে। সেন্সরের আপডেট ফ্রিকোয়েন্সি কমিয়ে (যেমন প্রতি সেকেন্ডে একবার) ব্যাটারি সাশ্রয় করা সম্ভব।

Permission Management:

  • অ্যাপ থেকে সেন্সর অ্যাক্সেস করার আগে অবশ্যই প্রয়োজনীয় পারমিশন নিশ্চিত করুন। permission_handler প্যাকেজ ব্যবহার করে পারমিশন ম্যানেজ করা সহজ হয়।

Flutter এ Device Sensors এবং Accelerometer ব্যবহার করে আপনি সহজেই ইন্টারঅ্যাক্টিভ অ্যাপ এবং গেম তৈরি করতে পারবেন, যা ব্যবহারকারীর অভিজ্ঞতা আরও উন্নত করবে।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...